package handlers

import (
	"cmspro-lite/cache"
	"cmspro-lite/model"
	"cmspro-lite/pkg"
	"encoding/json"
	"github.com/gin-gonic/gin"
	"strconv"
	"time"
)

//func Add(c *gin.Context) {
//	title := c.PostForm("title")
//	content := c.PostForm("content")
//	author := c.PostForm("author")
//	if title == "" || content == "" || author == "" {
//		c.JSON(200, gin.H{
//			"code": 400,
//			"msg":  "字段不可为空",
//		})
//		return
//	}
//	data := model.News{
//		Title:   title,
//		Content: content,
//		Author:  author,
//	}
//	err := model.DB.Create(&data).Error
//	if err != nil {
//		c.JSON(200, gin.H{
//			"code": 400,
//			"msg":  "添加失败",
//		})
//		return
//	}
//	redis_key := "news_add_id" + strconv.Itoa(int(data.ID))
//	var news model.News
//	model.DB.Where("id = ?", data.ID).First(&news)
//	jsonData, _ := json.Marshal(news)
//	cache.Rdb.Set(cache.Ctx, redis_key, jsonData, time.Hour*2)
//	c.JSON(200, gin.H{
//		"code": 200,
//		"msg":  "添加成功",
//	})
//	return
//}

//func Del(c *gin.Context) {
//	id := c.Query("id")
//	model.DB.Where("id = ?", id).Debug().Delete(&model.News{})
//
//	redis_key := "news_id_" + id
//	cache.Rdb.Del(cache.Ctx, redis_key)
//
//	c.JSON(200, gin.H{
//		"code": 200,
//		"msg":  "删除成功",
//	})
//	return
//}

//	func List(c *gin.Context) {
//		var news []model.News
//
//		redis_key := "news_list"
//
//		cacheData, _ := cache.Rdb.Get(cache.Ctx, redis_key).Result()
//		if cacheData == "" {
//			model.DB.Find(&news)
//			jsonData, _ := json.Marshal(news)
//			cache.Rdb.Set(cache.Ctx, redis_key, jsonData, time.Hour*2)
//		} else {
//			json.Unmarshal([]byte(cacheData), &news)
//		}
//
//		c.JSON(200, gin.H{
//			"code": 200,
//			"msg":  "ok",
//			"data": news,
//		})
//		return
//	}
//
//	func Add(c *gin.Context) {
//		title := c.PostForm("title")
//		content := c.PostForm("content")
//		author := c.PostForm("author")
//		data := model.News{
//			Title:   title,
//			Content: content,
//			Author:  author,
//		}
//		if title == "" || content == "" {
//			c.JSON(200, gin.H{
//				"code": 400,
//				"msg":  "字段不可为空",
//			})
//			return
//		}
//		var news model.News
//		err := model.DB.Create(&data).Error
//		if err != nil {
//			c.JSON(200, gin.H{
//				"code": 400,
//				"msg":  "添加失败",
//			})
//			return
//		}
//		redis_key := "news_id_" + strconv.Itoa(int(data.ID))
//		model.DB.Where("id = ?", data.ID).First(&news)
//
//		jsonData, _ := json.Marshal(redis_key)
//		cache.Rdb.Set(cache.Ctx, redis_key, jsonData, time.Hour*2)
//		c.JSON(200, gin.H{
//			"code": 200,
//			"msg":  "添加成功",
//		})
//		return
//	}
//
//	func Del(c *gin.Context) {
//		id := c.Query("id")
//		model.DB.Where("id = ?", id).Delete(&model.News{})
//		redis_key := "news_id_" + id
//		cache.Rdb.Del(cache.Ctx, redis_key)
//
//		c.JSON(200, gin.H{
//			"code": 200,
//			"msg":  "ok",
//		})
//		return
//	}
//
//	func List(c *gin.Context) {
//		/*
//			SELECT
//			news.title as Title,
//			news.content as Content,
//			news.author as Author,
//			users.username as Username,
//			users.news_id as NewID,
//			from
//			users
//			LEFT JOIN news ON news.id=users.news_id
//		*/
//		var news []model.Phg
//		page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
//		size, _ := strconv.Atoi(c.DefaultQuery("size", "5"))
//		offset := (page - 1) * size
//		redis_key := "news_id_list"
//		cacheData, _ := cache.Rdb.Get(cache.Ctx, redis_key).Result()
//		if cacheData == "" {
//			model.DB.Table("users").Select(
//				"news.title as Title",
//				"news.content as Content",
//				"news.author as Author",
//				"users.username as Username",
//				"users.news_id as NewID",
//			).Joins("LEFT JOIN news ON news.id=users.news_id").
//				Offset(offset).Limit(size).Find(&news)
//			jsonData, _ := json.Marshal(news)
//			cache.Rdb.Set(cache.Ctx, redis_key, jsonData, time.Hour*2)
//		} else {
//			json.Unmarshal([]byte(cacheData), &news)
//		}
//		var count int64
//		model.DB.Model(&model.News{}).Count(&count)
//		c.JSON(200, gin.H{
//			"code":  200,
//			"msg":   "ok",
//			"data":  news,
//			"count": count,
//		})
//		return
//	}
func Add(c *gin.Context) {
	title := c.PostForm("title")
	content := c.PostForm("content")
	author := c.PostForm("author")
	data := model.News{
		Title:   title,
		Content: content,
		Author:  author,
	}
	err := model.DB.Create(&data).Error
	if err != nil {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "添加失败",
		})
		return
	}
	var news model.News
	redis_key := "news_id_" + strconv.Itoa(int(data.ID))
	jsonData, _ := json.Marshal(news)
	cache.Rdb.Set(cache.Ctx, redis_key, jsonData, time.Hour*2)
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "添加成功",
	})
	return
}
func Del(c *gin.Context) {
	id := c.Query("id")
	model.DB.Where("id = ?", id).Delete(&model.News{})
	redis_key := "news_id_" + id
	cache.Rdb.Del(cache.Ctx, redis_key)
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "删除成功",
	})
	return
}
func List(c *gin.Context) {
	var news []model.News
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	size, _ := strconv.Atoi(c.DefaultQuery("size", "5"))
	offset := (page - 1) * size
	redis_key := "news_id_list"

	cacheData, _ := cache.Rdb.Get(cache.Ctx, redis_key).Result()
	if cacheData == "" {
		model.DB.Offset(offset).Limit(size).Find(&news)
		jsonData, _ := json.Marshal(news)
		cache.Rdb.Set(cache.Ctx, redis_key, jsonData, time.Hour*2)
	} else {
		json.Unmarshal([]byte(cacheData), &news)
	}
	var count int64
	model.DB.Model(&model.News{}).Count(&count)
	c.JSON(200, gin.H{
		"code":  200,
		"msg":   "ok",
		"data":  news,
		"count": count,
	})
	return
}

func Detail(c *gin.Context) {
	id := c.Query("id")
	var news model.News
	model.DB.Where("id = ?", id).First(&news)
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "ok",
		"data": news,
	})
	return
}

func Login(c *gin.Context) {
	username := c.PostForm("username")
	password := c.PostForm("password")
	if username == "" || password == "" {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "字段不可为空",
		})
		return
	}
	var user model.User
	err := model.DB.Where("username = ?", username).First(&user).Error
	if err != nil {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "查询失败",
		})
		return
	}
	if user.ID == 0 {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "用户不存在",
		})
		return
	}
	if user.Password != pkg.Str(password) {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "密码不正确",
		})
		return
	}
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "登录成功",
		"data": user,
	})
	return
}
